#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import os
from PathLenLib import FileInfo, Writer, Config, uprint

__author__ = "knkd"
__version__ = "2010.11.03-01.G"

def scan(workDir, listDir, output, conf):
    """Рекурсивна функція для обходу дерева каталогів."""
    startDir = os.getcwd()
    os.chdir(workDir)
    for name in listDir:
        if os.path.isfile(name): #~ Якщо name - файл.
            fullName = os.path.abspath(name)
            fileInfo = FileInfo(fullName, conf)
            output.write(fileInfo)
        elif os.path.isdir(name): #~ Якщо name - каталог.
            try: #~ Рекурсивно обробляємо каталоги.
                subListDir = os.listdir(name)
                fullName = os.path.abspath(name)
                fileInfo = FileInfo(fullName, conf)
                output.write(fileInfo)
                scan(name, subListDir, output, conf)
            except (WindowsError,E):
                raise E
                sys.exit()
            except (Exception,E): #~ Обробляємо недоступні каталоги.
                raise E
                fullName = os.path.abspath(name)
                fileInfo = FileInfo(fullName, conf)
                output.write(fileInfo)

    os.chdir(startDir)

def main(workDir, conf):
    """Основна функція.
    Запускає сканування дерева каталогів та друкує звіт на консоль."""
    output = Writer(conf,
                    solidTXT=conf.solidTxtName,
                    solidCSV=conf.solidCsvName,
                    splitCSV=conf.splitCsvName)
    
    listDir = os.listdir(workDir)
    scan(workDir, listDir, output, conf)
    output.close()
    
    solidTXT = conf.solidTxtName if conf.solidTxtName != None else ""
    solidCSV = conf.solidCsvName if conf.solidCsvName != None else ""
    splitCSV = output.splitNameList
    
    report = uprint("\r{spase}\r\n Обработано {fCount} файлов, из них {count} "\
                    "с длиной пути более {min} символов.\n"\
                    " Результаты сохранены в {txt} {csv} {sCSV}\n\a"
                    "".format(fCount=output.fullCounter,
                              txt=solidTXT,
                              csv=solidCSV,
                              sCSV=splitCSV,
                              min=conf.minLen,
                              count=output.writeCounter,
                              spase=" "*79
                             )
                    )
    print report

# Якщо файл запущено, а не імпортовано.
if __name__  == '__main__':
    scriptAbsPath = os.path.abspath(sys.argv[0])
    conf = Config(scriptAbsPath)
    workDir = '.'
    try:
        main(workDir, conf)
    except Exception,E:
        raise E
        print uprint("\nПрограмма завершена.\n")
        sys.exit(1)
